package com.exam.utils;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.exam.config.OSSConfig;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

/**
 * @author 小聋包
 * @date 2024-04-21 15:50
 * @Version 1.0
 */
@Component
@RequiredArgsConstructor
public class OSSUtil {
    private final OSSConfig ossConfig;

    /**
     * 将文件上传到OSS服务器，并返回文件访问地址
     *
     * @param uploadFile 上传的文件
     * @return 文件访问地址
     * @throws Exception 上传文件过程中出现的异常
     */
    public String picOSS(MultipartFile uploadFile) throws Exception {
        // 如果OSS未启用，则直接返回空字符串
        if (!ossConfig.isEnable()) {
            return "";
        }


        // 使用指定的OSS服务器地址、AccessKeyId和AccessKeySecret创建OSSClient实例
        OSSClient ossClient = new OSSClient(ossConfig.getEndpoint(), ossConfig.getAccesskeyid(), ossConfig.getAccesskeysecret());
        // 创建一个用于格式化日期的SimpleDateFormat对象
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");

        // 获取当前时间的时间戳，并将其格式化为"yyyy-MM-dd"格式的字符串
        long time = new Date().getTime();
        String date = sf.format(time);
        // 生成一个随机UUID，取前5位，并拼接上上传文件的原始文件名，作为上传文件的名称
        String fileName = UUID.randomUUID().toString().substring(0, 5) + uploadFile.getOriginalFilename();

        // 创建一个ObjectMetadata对象，用于设置上传文件的元信息
        // 设置上传文件的Content-Type
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));

        // 使用OSSClient的putObject方法将文件上传到指定的OSS存储桶中
        ossClient.putObject(ossConfig.getBucketname(), ossConfig.getKey() + date + "/" + fileName, new ByteArrayInputStream(uploadFile.getBytes()), objectMetadata);

        // 关闭client
        ossClient.shutdown();

        // 关闭OSSClient实例
        //        Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 10);
        //        return ossClient.generatePresignedUrl(BUCKETNAME, KEY + date + "/" + uploadFile.getOriginalFilename(), expiration).toString();

        // 注释掉的代码块用于生成预签名URL，并返回预签名URL的字符串表示
        // 但在这段代码中，该部分已被注释掉，因此不会执行
        return String.format("https://%s.%s/%s/%s", ossConfig.getBucketname(), ossConfig.getHost(), ossConfig.getKey() + date, fileName);
    // 返回上传文件的访问地址
    }

    /**
     * 根据文件的类型 设置请求头
     *
     * @param FilenameExtension 文件扩展名
     * @return 返回文件类型对应的MIME类型
     */

    public static String getContentType(String FilenameExtension) {
        // 如果文件扩展名为 .bmp
        if (FilenameExtension.equalsIgnoreCase(".bmp")) {
            // 返回 image/bmp 类型
            return "image/bmp";
        }
        // 如果文件扩展名为 .gif
        if (FilenameExtension.equalsIgnoreCase(".gif")) {
            // 返回 image/gif 类型
            return "image/gif";
        }
        // 如果文件扩展名为 .jpeg、.jpg 或 .png
        if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
                FilenameExtension.equalsIgnoreCase(".jpg") ||
                FilenameExtension.equalsIgnoreCase(".png")) {
            // 返回 image/jpg 类型
            return "image/jpg";
        }
        // 如果文件扩展名为 .html
        if (FilenameExtension.equalsIgnoreCase(".html")) {
            // 返回 text/html 类型
            return "text/html";
        }
        // 如果文件扩展名为 .txt
        if (FilenameExtension.equalsIgnoreCase(".txt")) {
            // 返回 text/plain 类型
            return "text/plain";
        }
        // 如果文件扩展名为 .vsd
        if (FilenameExtension.equalsIgnoreCase(".vsd")) {
            // 返回 application/vnd.visio 类型
            return "application/vnd.visio";
        }
        // 如果文件扩展名为 .pptx 或 .ppt
        if (FilenameExtension.equalsIgnoreCase(".pptx") ||
                FilenameExtension.equalsIgnoreCase(".ppt")) {
            // 返回 application/vnd.ms-powerpoint 类型
            return "application/vnd.ms-powerpoint";
        }
        // 如果文件扩展名为 .docx 或 .doc
        if (FilenameExtension.equalsIgnoreCase(".docx") ||
                FilenameExtension.equalsIgnoreCase(".doc")) {
            // 返回 application/msword 类型
            return "application/msword";
        }
        // 如果文件扩展名为 .xml
        if (FilenameExtension.equalsIgnoreCase(".xml")) {
            // 返回 text/xml 类型
            return "text/xml";
        }
        // 默认返回 image/jpg 类型
        return "image/jpg";
    }
}

